import DtoRequest from '../dto/DtoRequest.js'
import DtoResponse from '../dto/DtoResponse.js'

import MessageSenderUtils from '../../libs/message_sender_utils_0_0_3.js'
import Service from '../service_0_0_6.js'

/**
 * Класс, описывающий запрос и ответ, получаемый с помощью chrome.devtools.network.onRequestFinished.addListener
 */
export default class RequestAndResponseData {
    /** @type {string} */
    _priority

    /** @type {string} */
    _resourceType

    /**
     * Неизвестно какие элементы содержит данный массив
     * @type {Array.*}
     */
    cache

    /** @type {string} */
    serverIpAddress

    /** @type {string} */
    startedDateTime

    /** @type {number} */
    time

    /** @type {DtoRequest} */
    request

    /** @type {DtoResponse} */
    response

    constructor(obj, content) {
        this._priority = obj?._priority !== undefined ? obj._priority : null
        this._resourceType = obj?._resourceType !== undefined ? obj._resourceType : null
        this.cache = obj?.cache !== undefined ? obj.cache : null
        this.serverIpAddress = obj?.serverIpAddress !== undefined ? obj.serverIpAddress : null
        this.startedDateTime = obj?.startedDateTime !== undefined ? obj.startedDateTime : null
        this.time = obj?.time !== undefined ? obj.time : null
        this.request = obj?.request !== undefined ? DtoRequest.BuildFromObj(obj.request) : null
        this.response = obj?.response !== undefined ? DtoResponse.BuildFromObj(obj.response, content) : null
    }

    /**
     * Создать экземпляр класса из аналогичного по структуре объекта
     * @param {object} obj объект запроса
     * @param {string} content содержимое ответа
     * @returns экземпляр класса RequestAndResponse
     */
    static BuildFromObj(obj, content) {
        return new RequestAndResponseData(obj, content)
    }

    /** @type {string} */
    getPriority() {
        return this._priority
    }

    /** @type {string} */
    getResourceType() {
        return this._resourceType
    }

    /**
     * Неизвестно какие элементы содержит данный массив
     * @type {Array.*}
     */
    getCache() {
        return this.cache
    }

    /** @type {string} */
    getServerIpAddress() {
        return this.serverIpAddress
    }

    /** @type {string} */
    getStartedDateTime() {
        this.startedDateTime
    }

    /** @type {number} */
    getTime() {
        return this.time
    }

    /** @type {DtoRequest} */
    getRequest() {
        return this.request
    }

    /** @type {DtoResponse} */
    getResponse() {
        return this.response
    }
}

let utils = new MessageSenderUtils('RequestAndResponseData')

function sendMessageToComponent(text, recipient) {
    let message = new Object();
    message.data = text
    message.sender = utils.current
    message.recipient = recipient
    utils.log('Отправка сообщения по адресу: ' + message.recipient)
    // utils.logOutMessage(message)
    chrome.runtime.sendMessage(JSON.stringify(message),
        function (response) {
            if (chrome.runtime.lastError) {
                utils.log('Ошибка получения ответа');
                console.log("От опций не получено ответа, требуется открыть вкладку с настройками опций")
            } else {
                utils.logInMessage(JSON.parse(response))
            }
        });
}